package org.skywork.top.core.algorithm.str;

import java.util.ArrayList;
import java.util.List;

/**
 * Z 字形变换
 */
public class no_6 {

    /**
     * 将一个给定字符串 s 根据给定的行数 numRows ，以从上往下、从左到右进行 Z 字形排列。
     *
     * 比如输入字符串为 "PAYPALISHIRING" 行数为 3 时，排列如下：
     *
     * P(0,0)0           A(0,3)4             H(0,5)8                N(0,7)12
     * A(1,0)1  P(1,1)3  L(1,3)5   S(1,4)7   I(1,5)9    I(1,6)11    G(1,7)13
     * Y(2,0)2           I(2,3)6             R(2,5)10
     * 之后，你的输出需要从左往右逐行读取，产生出一个新的字符串，比如："PAHNAPLSIIGYIR"。
     */
    public String convert(String s, int numRows) {

        /**
         * 示例 1：
         *
         * 输入：s = "PAYPALISHIRING", numRows = 3
         * 输出："PAHNAPLSIIGYIR"
         *
         *
         * 示例 2：
         * 输入：s = "PAYPALISHIRING", numRows = 4
         * 输出："PINALSIGYAHRPI"
         * 解释：
         * P     I    N
         * A   L S  I G
         * Y A   H R
         * P     I
         *
         *
         * 示例 3：
         *
         * 输入：s = "A", numRows = 1
         * 输出："A"
         *
         */
        int len = s.length();
        if(s.length() == 1){
            return s;
        }
        char[][] arr = new char[numRows][len];
        char[] chars = s.toCharArray();
        int y = 0;
        int index = 0;
        while (index < chars.length) {
            for (int i = 0; i < numRows && index < chars.length; i++) {
                arr[i][y] = chars[index++];
            }
            for (int i = numRows - 2; i > 0 && index < chars.length; i--) {
                arr[i][++y] = chars[index++];
            }
            y++;
        }
        String str = "";
        for(int i = 0; i < numRows; i++){
            for(int j = 0; j < len; j++){
                if(arr[i][j] != '\u0000'){
                    str += arr[i][j];
                }
            }
        }
        return str;
    }

    public String convert2(String s, int numRows) {
        if(numRows < 2) return s;
        List<StringBuilder> rows = new ArrayList<StringBuilder>();
        for(int i = 0; i < numRows; i++) rows.add(new StringBuilder());
        int i = 0, flag = -1;
        for(char c : s.toCharArray()) {
            rows.get(i).append(c);
            if(i == 0 || i == numRows -1) flag = - flag;
            i += flag;
        }
        StringBuilder res = new StringBuilder();
        for(StringBuilder row : rows) res.append(row);
        return res.toString();
    }

    public static void main(String[] args) {
        String str = "PAYPALISHIRING";
        no_6 no_6 = new no_6();
        System.out.println(no_6.convert2(str, 3));
    }
}
